
//总结：this的用法
//this本身代表的是当前对象的引用
//this();调用当前类当中的其他构造方法 只能在构造方法内部使用，且只能在第一行 不能形成环
//this.data 访问当前对象的属性
//this.func() 调用当前对象的方法

//面向对象的三大特征： 封装  继承  多态
//封装：将数据和操作数据的方法进行有机结合，隐藏对象的属性和实现细节，
//仅对外公开接口来和对象进行交互 通过关键字private
//意义：隐藏类的实现细节，从而达到安全性
class Student {
    //成员变量：定义在方法的外部，类的内部！
//    public String name;//姓名
    //被private修饰就叫封装
    //普通成员变量
    private String name;//此时这个属性只能在当前类中使用
    private int age;//年龄

    //静态成员变量
    public static String classRoom;//教室
    //当把classRoom使用static修饰之后，就不存在于对象之中了。
    //存在JVM的方法区，所有对象共用
    //使用不依赖于对象 访问方式就变成了 类名.xxx

//    //初始化方法3  不常用
//    public String name = "lisi";//姓名
//    public int age = 20;//年龄

    //构造方法  非常特殊的一个方法。作用：对对象中的成员进行初始化，不负责给对象开辟空间
    //完成一个对象的构造分两步 1.分配内存 2.调用合适的构造方法
    //在创建对象时，由编译器自动调用，并且在整个对象的生命周期内只调用一次
    //当调用完成构造方法之后，对象才产生了
    //1.方法名必须和类名相同
    //2.没有返回值类型 设置成void也不行

    //可以快捷生成 constructor 不带参数的得自己敲
    public Student() {
        //this() 调用当前类中的其他构造方法 会自动匹配 不能形成环
        //只能在构造方法内部使用，只能在第一行 其他用法中不必在意是否在第一行
        //this("小明",18);
        System.out.println("不带参数的构造方法！");
        //输出结果-- 带有两个参数的构造方法！
        //         不带参数的构造方法！
    }
    public Student(String name,int age) {
        this.name = name;
        this.age = age;
        System.out.println("带有两个参数的构造方法！");
    }
    //构造方法之间是可以构成方法的重载的---方法名相同，参数列表不同

    //可以快捷生成getter和setter
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }


    //成员方法
    public void eat() {
        //this表示当前对象的引用 谁调用eat，谁就是this
        System.out.println(this.name+" 正在吃饭！");
        this.show();
    }
    public void show() {
        func();//非静态里可以调用静态的
        System.out.println("姓名："+this.name+" 年龄："+this.age);
    }

    public static void func() {
        System.out.println("这是一个静态方法！");
        //show();
        //在静态方法内部不能直接调用非静态成员方法或成员变量
        //static方法不能使用this
        //非静态方法的调用必须有对象
        Student student = new Student();
        student.show();
    }

}
public class Test7 {
    public static void main(String[] args) {
//        //stu();
//        Student student = new Student();
//        //会输出--->不带参数的构造方法！
//        //如果把不带参数的构造方法删掉，new Student()会报错
//        //当类中有一个构造方法时，java就不会帮你再提供一个构造方法了
//        //new后面Student()相当于调用了构造方法
//
//        //初始化方法2
//        Student student1 = new Student("张飞",99);
//        //会输出--->带有两个参数的构造方法！

//        Student student = new Student();
//        //student.name = "王五";//error student的属性只能在类中使用
//        //可以通过getName获取name的值，setName修改name的值
//        student.setName("王五");
//        System.out.println(student.getName());//王五

//        Student student1 = new Student("A",10);
//        student1.classRoom = "109";
//
//        Student student2 = new Student("B",11);
//        student2.classRoom = "109";
//
//        Student student3 = new Student("C",9);
//        student3.classRoom = "109";

        //静态成员变量（类变量）的使用
        Student.classRoom = "109";
        System.out.println(Student.classRoom);//109

        //静态成员方法（类方法）的使用
        Student.func();

        System.out.println(add(1,2));//3
        //System.out.println(add2(1,2));//error
        //必须有对象才能调用add2
        Test7 test7 = new Test7();
        System.out.println(test7.add2(2,3));//5

    }

    //静态不依赖对象，可以直接调用
    public static int add(int a,int b) {
        return a + b;
    }
    public int add2(int a,int b) {
        return a + b;
    }
//    public static void stu() {
//        Student student1 = new Student();//实例化对象
//        //初始化方法1
//        student1.name = "张三";
//        student1.age = 19;
//        System.out.println(student1.name);//张三
//        System.out.println(student1.age);//19
//        student1.eat();
//
//        Student student2 = new Student();
//        student2.name = "李四";
//        student2.age = 21;
//        System.out.println(student2.name);//李四
//        System.out.println(student2.age);//21
//        student2.eat();
//
//        //如果不初始化name和age
//        //引用类型一般默认为null  基本类型默认是自己的0值
//        //int--0  float--0.0f  char--'\u0000'  boolean--false
//        Student student3 = new Student();
//        System.out.println(student3.name);//null
//        System.out.println(student3.age);//0
//        //当类里面没有构造方法时，java会自动帮你提供一个不带参数的构造方法
//
//    }
}


